package br.com.controlador;

import br.com.modelo.Caixa;
import br.com.modelo.Cidade;
import br.com.modelo.Funcionario;
import java.io.Serializable;
import java.sql.Connection;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import util.JPAUtil;
import util.Utilitario;

/**
 *
 * @author Gilberto
 */
@ManagedBean
@ViewScoped
public class FuncionarioControler implements Serializable {

    private Funcionario funcionario;
    private List<Funcionario> listFuncionario = new ArrayList<Funcionario>();
    private List<Cidade> listCidades = new ArrayList<Cidade>();
    private String campoBusca = new String();
    private Boolean alterando = false;

    @PostConstruct
    public void init() {
        setFuncionario(new Funcionario());
        setListFuncionario(Funcionario.retornaFuncionarios());
    }

    /**
     * @return the funcionario
     */
    public Funcionario getFuncionario() {
        return funcionario;
    }

    /**
     * @param funcionario the funcionario to set
     */
    public void setFuncionario(Funcionario funcionario) {
         alterando = true;
        listCidades = Cidade.retornaCidadeDoEstado(funcionario.getCidade().getEstado());
        this.funcionario = funcionario;
    }

    /**
     * @return the campoBusca
     */
    public String getCampoBusca() {
        return campoBusca;
    }

    /**
     * @param campoBusca the campoBusca to set
     */
    public void setCampoBusca(String campoBusca) {
        this.campoBusca = campoBusca;
    }

    /**
     * @return the listFuncionario
     */
    public List<Funcionario> getListFuncionario() {
        return listFuncionario;
    }

    /**
     * @param listFuncionario the listFuncionario to set
     */
    public void setListFuncionario(List<Funcionario> listFuncionario) {
        this.listFuncionario = listFuncionario;
    }

    public void inicializaObj() {
        alterando = false;
        funcionario = new Funcionario();
    }
    public void alterar() {
        alterando = false;
    }
    public void salvar() {
        try {
            //removendo a mascara
            funcionario.setTelefone1(Utilitario.removeCaracterdeUmaString(getFuncionario().getTelefone1()));
            funcionario.setTelefone2(Utilitario.removeCaracterdeUmaString(getFuncionario().getTelefone2()));
            funcionario.setCelular(Utilitario.removeCaracterdeUmaString(getFuncionario().getCelular()));
            funcionario.setCep(Utilitario.removeCaracterdeUmaString(getFuncionario().getCep()));
            funcionario.setCpf(Utilitario.removeCaracterdeUmaString(getFuncionario().getCpf()));
            funcionario.setNome(getFuncionario().getNome().toUpperCase());//colocando o nome em maisculo]
            //cidade e UF-- salvando a cidade e uf na tabela de funcionario alem do código do relacionanmento entre cidade
            Cidade cid = Cidade.retornaCidadePorId(funcionario.getCidade().getId());
            funcionario.setCidade(cid);
            funcionario.setUf(cid.getEstado());
            funcionario.setCidade_fun(cid.getCidade());

            funcionario = funcionario.salvar();
            listFuncionario = Funcionario.retornaFuncionarios();
            //retornando caixas e salvando nos caixas
            List<Caixa> caixa = CaixaControler.retornaCaixa();
            for (Caixa c : caixa) {
                Connection con = JPAUtil.conectaBanco(c.getIp());
                if (con != null) {
                    funcionario = funcionario.salvarCaixas(c.getIp());
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                }
            }
            org.primefaces.context.RequestContext.getCurrentInstance().execute("carDialogFuncionario.hide();");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Problema ao cadastrar o funcionário!!", "Mensagem"));
        }
    }

    public void excluir() {
        try {
            funcionario.setExcluido('S');
            funcionario = funcionario.salvar();
            listFuncionario = Funcionario.retornaFuncionarios();
            //retornando caixas e salvando nos caixas
            List<Caixa> caixa = CaixaControler.retornaCaixa();
            for (Caixa c : caixa) {
                Connection con = JPAUtil.conectaBanco(c.getIp());
                if (con != null) {
                    funcionario = funcionario.salvarCaixas(c.getIp());
                    FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Transferido para caixa(" + c.getNome() + ")", "Mensagem"));
                }
            }
            org.primefaces.context.RequestContext.getCurrentInstance().execute("carDialogFuncionario.hide();");
        } catch (Exception e) {
            FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "Erro ao excluir funcionário!!", "Mensagem"));
        }
    }

    public List<String> retornaEstados() {
        return Cidade.retornEstados();
    }

    public void carregaCidades() {
        setListCidades(Cidade.retornaCidadeDoEstado(funcionario.getCidade().getEstado()));
    }

    public void realizaBusca() {
        listFuncionario = Funcionario.retornaBusca(getCampoBusca());
    }

    public void inicializaBusca() {
        campoBusca = new String();
    }

    public List<Funcionario> getRetornaFuncionarioSemLogin() {
        return Funcionario.retornaFuncionariosSemAcesso();
    }

    /**
     * @return the listCidades
     */
    public List<Cidade> getListCidades() {
        return listCidades;
    }

    /**
     * @param listCidades the listCidades to set
     */
    public void setListCidades(List<Cidade> listCidades) {
        this.listCidades = listCidades;
    }

    /**
     * @return the alterando
     */
    public Boolean getAlterando() {
        return alterando;
    }

    /**
     * @param alterando the alterando to set
     */
    public void setAlterando(Boolean alterando) {
        this.alterando = alterando;
    }
}
